From: Giovanni Campagna Date: Sun, 26 Aug 2012 13:49:18 +0000 (+0200) Subject: PanelMenu: Allow multiple icons in one SystemStatusButton X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~6024 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=41dc9e089436cd99a6aeae96557812bd2e62b626;p=gnome-shell.git PanelMenu: Allow multiple icons in one SystemStatusButton This generalizes the code previously used by NetworkMenu, so that all SystemStatusButton now can add multiple icons. https://bugzilla.gnome.org/show_bug.cgi?id=682540 --- diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css index 29cd67752..c27dadc19 100644 --- a/data/theme/gnome-shell.css +++ b/data/theme/gnome-shell.css @@ -502,7 +502,7 @@ StButton.popup-menu-item:insensitive { -boxpointer-gap: 4px } -#networkMenu { +.panel-status-button-box { spacing: 4px; } diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js index 542bb72e6..29007bf26 100644 --- a/js/ui/panelMenu.js +++ b/js/ui/panelMenu.js @@ -1,6 +1,7 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; const Gtk = imports.gi.Gtk; const Lang = imports.lang; const Shell = imports.gi.Shell; @@ -230,19 +231,36 @@ const SystemStatusButton = new Lang.Class({ _init: function(iconName, nameText) { this.parent(0.0, nameText); - - this._iconActor = new St.Icon({ icon_name: iconName, - icon_type: St.IconType.SYMBOLIC, - style_class: 'system-status-icon' }); - this.actor.add_actor(this._iconActor); this.actor.add_style_class_name('panel-status-button'); + + this._box = new St.BoxLayout({ style_class: 'panel-status-button-box' }); + this.actor.add_actor(this._box); + + this.setIcon(iconName); + }, + + addIcon: function(gicon) { + let icon = new St.Icon({ gicon: gicon, + icon_type: St.IconType.SYMBOLIC, + style_class: 'system-status-icon' }); + this._box.add_actor(icon); + + return icon; }, setIcon: function(iconName) { - this._iconActor.icon_name = iconName; + // Need to first add a NULL GIcon and then set icon_name, to ensure + // compatibility with -symbolic fallbacks + + if (!this.mainIcon) + this.mainIcon = this.addIcon(null); + this.mainIcon.icon_name = iconName; }, setGIcon: function(gicon) { - this._iconActor.gicon = gicon; + if (this.mainIcon) + this.mainIcon.gicon = gicon; + else + this.mainIcon = this.addIcon(gicon); } }); diff --git a/js/ui/status/network.js b/js/ui/status/network.js index c7b9665e0..a235beeca 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -1,6 +1,7 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const GLib = imports.gi.GLib; const GObject = imports.gi.GObject; +const Gio = imports.gi.Gio; const Lang = imports.lang; const NetworkManager = imports.gi.NetworkManager; const NMClient = imports.gi.NMClient; @@ -1564,25 +1565,13 @@ const NMDeviceWireless = new Lang.Class({ const NMApplet = new Lang.Class({ Name: 'NMApplet', - Extends: PanelMenu.Button, + Extends: PanelMenu.SystemStatusButton, _init: function() { - this.parent(0.0, _('Network')); + this.parent('network-offline', _('Network')); - this._box = new St.BoxLayout({ name: 'networkMenu' }); - this.actor.add_actor (this._box); - this.actor.add_style_class_name('panel-status-button'); - - this._primaryIcon = new St.Icon({ icon_name: 'network-offline', - icon_type: St.IconType.SYMBOLIC, - style_class: 'system-status-icon' }); - this._box.add_actor(this._primaryIcon); - - this._secondaryIcon = new St.Icon({ icon_name: 'network-vpn', - icon_type: St.IconType.SYMBOLIC, - style_class: 'system-status-icon', - visible: false }); - this._box.add_actor(this._secondaryIcon); + this._secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn' })); + this._secondaryIcon.hide(); this._client = NMClient.Client.new(); @@ -1691,10 +1680,6 @@ const NMApplet = new Lang.Class({ })); }, - setIcon: function(iconName) { - this._primaryIcon.icon_name = iconName; - }, - setLockedState: function(locked) { // FIXME: more design discussion is needed before we can // expose part of this menu